package cn.mini.mybatis.mybatis.io;


import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 文件资源加载工具类
 * @author 毅航
 * @date 2025/6/8 16:34
 */
public class Resources {

    public static Reader getResourceAsReader(String resource) throws IOException {
        return new InputStreamReader(getResourceAsStream(resource));
    }

    private static InputStream getResourceAsStream(String resource) throws IOException {
        ClassLoader[] classLoaders = getClassLoaders();
        for (ClassLoader classLoader : classLoaders) {
            // 尝试通过当前类加载器获取资源流
            InputStream inputStream = classLoader.getResourceAsStream(resource);
            // 如果输入流不为空，说明资源被成功加载
            if (inputStream != null) {
                return inputStream;
            }
        }
        // 遍历所有类加载器后仍无法加载资源，抛出异常
        throw new IOException("Could not find resource " + resource);
    }


    private static ClassLoader[] getClassLoaders() {
        return new ClassLoader[]{
                ClassLoader.getSystemClassLoader(),
                Thread.currentThread().getContextClassLoader()};
    }
    /**
     * 使用当前上下文类加载器或系统类加载器加载指定的类。
     * 此方法尝试通过当前线程的上下文类加载器加载类，
     * 如果失败，则回退到使用系统类加载器进行加载。
     *
     * @param className - 要加载的类的全限定名
     * @return 成功加载的类对象
     * @throws ClassNotFoundException 如果无法找到并加载该类
     */
    public static Class<?> classForName(String className) throws ClassNotFoundException {
        try {
            // 尝试使用当前线程的上下文类加载器加载类
            return Thread.currentThread().getContextClassLoader().loadClass(className);
        } catch (ClassNotFoundException e) {
            // 如果找不到类，尝试使用系统类加载器回退加载
            return Class.forName(className);
        }
    }
}